import 'package:flutter/material.dart';
import 'package:flutter_shop/jpush/jpush_receiver.dart';
import 'package:flutter_shop/utils/utils.dart';
import 'package:jpush_flutter/jpush_flutter.dart';

///Title:极光推送 <br/>
///Description: <br/>
///author:xiemiao <br/>
///date: 2020-03-02 <br/>
///version 1.0 <br/>
class JpushService {
  JPush _jpush;
  JpushReceiver _jpushReceiver;

  factory JpushService() => _getInstance();

  static JpushService _instance;

  static JpushService _getInstance() {
    if (_instance == null) {
      _instance = JpushService._internal();
    }
    return _instance;
  }

  JpushService._internal() {
    _jpush = new JPush();
    _jpushReceiver = new JpushReceiver();
  }

  void init(String appKey) {
    //注意：addEventHandler 方法建议放到 setup 之前，其他方法需要在 setup 方法之后调用
    _jpushReceiver.addEventHandler(_jpush);
    //初始化极光推送,注意AndroidManifest和app下的build.gradle里manifestPlaceholders配置key
    _jpush.setup(
      appKey: appKey,
      channel: "theChannel",
      production: Utils.isProd,
      debug: !Utils.isProd, // 设置是否打印 debug 日志
    );
  }

  ///绑定上下文
  ///The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator widget.
  ///所以暂时需要在index_page里去绑定context
  void bindContext(BuildContext context) {
    _jpushReceiver.bindContext(context);
  }

  ///获取 RegistrationId, JPush 可以通过制定 RegistrationId 来进行推送。
  Future<String> getRegistrationID() {
    return _jpush.getRegistrationID();
  }

  /// 停止接收推送，调用该方法后应用将不再受到推送，如果想要重新收到推送可以调用 resumePush。
  Future stopPush() {
    return _jpush.stopPush();
  }

  /// 恢复推送功能。
  Future resumePush() {
    return _jpush.resumePush();
  }

  ///
  /// 设置别名，极光后台可以通过别名来推送，一个 App 应用只有一个别名，一般用来存储用户 id。
  /// @param {String} alias
  /// @param {Function} success = ({"alias":String}) => {  }
  /// @param {Function} fail = ({"errorCode":int}) => {  }
  ///
  Future<Map<dynamic, dynamic>> setAlias(String alias) async {
    return _jpush.setAlias(alias);
  }

  ///
  /// 可以通过 deleteAlias 方法来删除已经设置的 alias。
  ///
  /// @param {Function} success = ({"alias":String}) => {  }
  /// @param {Function} fail = ({"errorCode":int}) => {  }
  ///
  Future<Map<dynamic, dynamic>> deleteAlias() async {
    return _jpush.deleteAlias();
  }

  ///
  /// iOS Only
  /// 申请推送权限，注意这个方法只会向用户弹出一次推送权限请求（如果用户不同意，之后只能用户到设置页面里面勾选相应权限），需要开发者选择合适的时机调用。
  /// 注意： iOS10+ 可以通过该方法来设置推送是否前台展示，是否触发声音，是否设置应用角标 badge
  ///
  void applyPushAuthority([NotificationSettingsIOS iosSettings = const NotificationSettingsIOS()]) {
    _jpush.applyPushAuthority(iosSettings);
  }

  ///
  /// 设置应用 Badge（小红点）
  ///
  /// @param {Int} badge
  ///
  /// 注意：如果是 Android 手机，目前仅支持华为手机
  ///
  Future setBadge(int badge) async {
    return _jpush.setBadge(badge);
  }
}
